package com.mt.roll.wms.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.mt.roll.core.api.Assert;
import com.mt.roll.core.base.BaseService;
import com.mt.roll.core.dal.entity.ScrapTypeInformation;
import com.mt.roll.core.dal.service.ScrapTypeInformationServiceBiz;
import com.mt.roll.core.enums.WhetherEnum;
import com.mt.roll.core.params.EnabledParam;
import com.mt.roll.core.params.IdListParam;
import com.mt.roll.core.params.IdParam;
import com.mt.roll.core.utils.CodeGeneratorHelper;
import com.mt.roll.core.vo.IdListVo;
import com.mt.roll.core.vo.IdVo;
import com.mt.roll.core.vo.PageVo;
import com.mt.roll.core.vo.R;
import com.mt.roll.wms.params.ScrapTypeInformationParam;
import com.mt.roll.wms.params.ScrapTypeInformationQueryParam;
import com.mt.roll.wms.service.ScrapTypeInformationService;
import com.mt.roll.wms.vo.ScrapTypeInformationVo;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;

@Service
@Transactional
public class ScrapTypeInformationServiceImpl extends BaseService implements ScrapTypeInformationService {
    @Autowired
    private ScrapTypeInformationServiceBiz scrapTypeInformationServiceBiz;


    /**
     * 获取xx
     *
     * @param idParam 主键参数
     * @return xx
     */
    @Override
    public R<ScrapTypeInformationVo> get(IdParam idParam) {
        ScrapTypeInformation scrapTypeInformation = scrapTypeInformationServiceBiz.getById(idParam.getId());
        Assert.notNull("报废类型信息不存在", scrapTypeInformation);
        ScrapTypeInformationVo scrapTypeInformationVo = ScrapTypeInformationVo.builder().build();
        BeanUtils.copyProperties(scrapTypeInformation, scrapTypeInformationVo);
        return successful(scrapTypeInformationVo);
    }

    /**
     * 获取xx列表
     *
     * @param scrapTypeInformationQueryParam xx查询参数
     * @return xx列表
     */
    @Override
    public R<List<ScrapTypeInformationVo>> list(ScrapTypeInformationQueryParam scrapTypeInformationQueryParam) {
        return null;
    }

    /**
     * 获取xx分页列表
     *
     * @param scrapTypeInformationQueryParam xx查询参数
     * @return xx分页列表
     */
    @Override
    public R<PageVo<ScrapTypeInformationVo>> page(ScrapTypeInformationQueryParam scrapTypeInformationQueryParam) {
        QueryWrapper<ScrapTypeInformation> wrapper = new QueryWrapper<>();
        wrapper.eq(ObjectUtils.isNotNull(scrapTypeInformationQueryParam.getEnabled()), ScrapTypeInformation.ENABLED, scrapTypeInformationQueryParam.getEnabled())
                .like(StringUtils.isNotBlank(scrapTypeInformationQueryParam.getScrapType()), ScrapTypeInformation.SCRAP_TYPE, scrapTypeInformationQueryParam.getScrapType());
        wrapper.orderByDesc(ScrapTypeInformation.CREATE_TIME);
        IPage<ScrapTypeInformation> page = scrapTypeInformationServiceBiz.page(new Page<>(scrapTypeInformationQueryParam.getCurrent(), scrapTypeInformationQueryParam.getSize()), wrapper);
        return successful(new PageVo<>(page, ScrapTypeInformationVo.class));
    }

    /**
     * 获取xx树列表
     *
     * @param scrapTypeInformationQueryParam xx查询参数
     * @return xx树列表
     */
    @Override
    public R<List<ScrapTypeInformationVo>> tree(ScrapTypeInformationQueryParam scrapTypeInformationQueryParam) {
        return null;
    }

    /**
     * 新增xx
     *
     * @param scrapTypeInformationParam xx参数
     * @return 主键
     */
    @Override
    public R<IdVo> add(ScrapTypeInformationParam scrapTypeInformationParam) {
        QueryWrapper<ScrapTypeInformation> wrapper = new QueryWrapper<>();
        wrapper.eq(ScrapTypeInformation.CODE, scrapTypeInformationParam.getCode());
        Assert.eqZero(scrapTypeInformationServiceBiz.count(wrapper), "报废类型信息编码已经存在");
        ScrapTypeInformation scrapTypeInformation = new ScrapTypeInformation();
        BeanUtils.copyProperties(scrapTypeInformationParam, scrapTypeInformation);
        setCommonField(scrapTypeInformation);
        scrapTypeInformationServiceBiz.save(scrapTypeInformation);
        return successful(IdVo.builder().id(Long.valueOf(scrapTypeInformation.getId().toString())).build());
    }

    /**
     * 更新xx
     *
     * @param scrapTypeInformationParam xx参数
     * @return 主键
     */
    @Override
    public R<IdVo> update(ScrapTypeInformationParam scrapTypeInformationParam) {
        ScrapTypeInformation scrapTypeInformation = scrapTypeInformationServiceBiz.getById(scrapTypeInformationParam.getId());
        //修改报废类型编码需要检验新编码是否已存在
        if (!scrapTypeInformation.getCode().equals(scrapTypeInformationParam.getCode())) {
            QueryWrapper<ScrapTypeInformation> wrapper = new QueryWrapper<>();
            wrapper.eq(ScrapTypeInformation.CODE, scrapTypeInformationParam.getCode());
            Assert.eqZero(scrapTypeInformationServiceBiz.count(wrapper), "报废类型信息编码已经存在");
        }
        ScrapTypeInformation updateScrap = new ScrapTypeInformation();
        BeanUtils.copyProperties(scrapTypeInformationParam, updateScrap);
        setUpdateCommonField(updateScrap);
        scrapTypeInformationServiceBiz.updateById(updateScrap);
        return successful(IdVo.builder().id(Long.valueOf(scrapTypeInformation.getId().toString())).build());
    }

    /**
     * 启用停用
     *
     * @param enabledParam 启停参数
     * @return 主键
     */
    @Override
    public R<IdVo> enabled(EnabledParam enabledParam) {
        return null;
    }

    /**
     * 删除工厂
     *
     * @param idParam 主键参数
     * @return 主键
     */
    @Override
    public R<IdVo> delete(IdParam idParam) {
        ScrapTypeInformation scrapTypeInformation = scrapTypeInformationServiceBiz.getById(idParam.getId());
        if (scrapTypeInformation == null) {
            return failed("报废类型信息不存在");
        }
        //使用更新方式删除，需要把code设置为历史code（后面跟随机数）
        ScrapTypeInformation updateScrap = new ScrapTypeInformation().setId(scrapTypeInformation.getId());
        updateScrap.setCode(scrapTypeInformation.getCode() + "_" + RandomUtils.nextInt());
        updateScrap.setValid(WhetherEnum.NO.getValue());
        setUpdateCommonField(updateScrap);
        scrapTypeInformationServiceBiz.updateById(updateScrap);
        //更新时逻辑删除字段没有更新，需要再调用一次删除操作
        scrapTypeInformationServiceBiz.removeById(updateScrap.getId());
        return successful(IdVo.builder().id(Long.valueOf(scrapTypeInformation.getId().toString())).build());
    }

    /**
     * 批量删除xx
     *
     * @param idListParam 主键列表参数
     * @return 主键列表
     */
    @Override
    public R<IdListVo> delete(IdListParam idListParam) {
        return null;
    }

    @Override
    public R<String> getCode() {
        return successful(CodeGeneratorHelper.getScrapTypeInformationCode());
    }
}
